package com.escool.controller;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.escool.dto.EstudianteDetalleDTO;
import com.escool.dto.NotaAlumno;
import com.escool.dto.NotaMateria;
import com.escool.model.TbAlumno;
import com.escool.model.TbExpediente;
import com.escool.model.TbExpedienteHasMateria;
import com.escool.model.TbMateria;
import com.escool.model.TbPeriodo;
import com.escool.model.TbTurno;
import com.escool.model.VwAlumnosUsuario;
import com.escool.model.VwNotas;
import com.escool.model.VwUser;
import com.escool.service.AlumnoService;
import com.escool.service.CatEventoService;
import com.escool.service.CatMatriculaService;
import com.escool.service.CatTipoPagoService;
import com.escool.service.ExpedienteService;
import com.escool.service.FindService;
import com.escool.service.MateriaService;
import com.escool.service.PerfilPagoService;
import com.escool.service.PeriodoService;
import com.escool.service.RolService;
import com.escool.service.TurnoService;

@Controller
public class FindController {
	@Autowired
	PeriodoService periodoService;
	
	@Autowired
	TurnoService turnoService;
	
	@Autowired
	FindService findServie;
	
	@Autowired
	MateriaService materiaService;
	
	@Autowired
	RolService rolService;
	
	@Autowired
	CatEventoService catActividadService;
	
	@Autowired
	CatMatriculaService matriculaService;
	
	@Autowired
	PerfilPagoService pagoService;
	
	//Alumno + Expediente + Materia
	@Autowired
	ExpedienteService expService;

	
	@RequestMapping("findTurno")
	public String findTurno(Map<String, Object> map){		
		map.put("turnoList", turnoService.listTurno());
		return "/findTurno";
	}
	
	@RequestMapping("findPeriodo")
	public String findPeriodo(Map<String, Object> map){		
		map.put("periodoList", periodoService.listPeriodo());
		return "/findPeriodo";
	}
	
	@RequestMapping("findSeccion")
	public String findSeccion(Map<String, Object> map){		
		map.put("seccionList", findServie.listVwSecciones());
		return "/findSeccion";
	}
	
	@RequestMapping("findSeccionCupo")
	public String findSeccionCupo(Map<String, Object> map){		
		map.put("seccionList", findServie.listVwCupoSecciones());
		return "/findSeccionCupo";
	}
	
	@RequestMapping("findSede")
	public String findSede(Map<String, Object> map){		
		map.put("sedeList", findServie.listVwSede());
		return "/findSede";
	}
	
	@RequestMapping("findPersonal")
	public String findPersonal(Map<String, Object> map){		
		map.put("personalList", findServie.listVwPersonal());
		return "/findPersonal";
	}
	
	
	@RequestMapping("findMateria")
	public String findMateria(Map<String, Object> map){		
		map.put("materiaList", materiaService.listMateria());
		return "/findMateria";
	}
	
	@RequestMapping("findRol")
	public String findRol(Map<String, Object> map){		
		map.put("rolList", rolService.listRol());
		return "/findRol";
	}
	
	
	@RequestMapping("findMateriaSeccion")
	public String findMateriaSeccion(Map<String, Object> map){		
		map.put("materiaSeccionList", findServie.listVwMateriaSeccion());
		return "/findMateriaSeccion";
	}
	
	@RequestMapping("findSedeSec")
	public String findSedeSec(Map<String, Object> map){		
		map.put("sedeSecList", findServie.listVwSedeSeccion());
		return "/findSedeSec";
	}
	
	@RequestMapping("findMatricula")
	public String findMatricula(Map<String, Object> map){		
		map.put("matriculaList", matriculaService.listTbMatricula());
		return "/findMatricula";
	}
	
	@RequestMapping("findPerfPago")
	public String findPerfPago(Map<String, Object> map){		
		map.put("pagoList", pagoService.listPerfPago());
		return "/findPerfPago";
	}
	
	@RequestMapping("findActividad")
	public String findActividad(Map<String, Object> map){
		map.put("actividadList", catActividadService.listTbActividad());
		return "/findActividad";
	
	}
	
	@RequestMapping("findTempMateria")
	public String findTempMateria(Map<String, Object> map){
		map.put("listTbCatMateriaTemp", findServie.listTbCatMateriaTemp());
		return "/findTempMateria";
	
	}
	
	@RequestMapping("findParientesAlumno")
	public String findParientesAlumno(Map<String, Object> map,HttpServletRequest request){
		String codAlumno = request.getParameter("codAlumno");
		map.put("listVwParentesco", findServie.listVwParentesco(codAlumno));
		return "/findParientesAlumno";
	
	}
	
	@RequestMapping(value="findVwUser",method = RequestMethod.GET,headers="Accept=*/*")
	public @ResponseBody List<VwUser>findVwUser(@RequestParam("term") String query){		
		return findServie.listVwUser(query);	
	}
	
	@RequestMapping(value="findVwUserMod",method = RequestMethod.GET,headers="Accept=*/*")
	public @ResponseBody List<VwAlumnosUsuario> findVwUserMod(@RequestParam("term") String query,@RequestParam("sedeSeccion") int seccionsedeId,@RequestParam("codigoMensaje") String codigoMensaje){
		if(codigoMensaje.equals("0")){
			return findServie.listVwAlumnosUsuario(query, seccionsedeId);
		}else{
			return findServie.listVwAlumnosUsuario(query, seccionsedeId,codigoMensaje);
		}
			
	}
	
	
	@RequestMapping("test")
	public String test(Map<String, Object> map){
		
		return "/test";
	
	}
	
	
	@RequestMapping("findNotasAlumno")
	public String findNotasAlumno(Map<String, Object> map){
		try
		{
			User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
			
			map.put("vwAlumnoNotasList", findServie.listVwNotas(user.getUsername()));
			
			//System.out.println("nombre logado" + user.getUsername());
			return "/notasAlumno";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
		
	}
	
	@RequestMapping("findNotasAlumno_2")
	public String findNotasAlumno_2(@ModelAttribute("na") @Valid NotaAlumno notaAlumno, BindingResult result, ModelMap map){
		try
		{
			List lvw = findServie.listVwNotasAlumnoPeriodoMateria(notaAlumno.getCodigoAlumno(),notaAlumno.getPeriodo(),notaAlumno.getNombreMateria());
			System.out.println(notaAlumno.getCodigoAlumno() +"->"+ notaAlumno.getPeriodo());
			double promedio = 0;
			double pfinal =0;
			if(!lvw.isEmpty()){
				Iterator it = lvw.iterator();
				while(it.hasNext()){
					VwNotas nota = (VwNotas) it.next();
					
					promedio = (nota.getId().getPorcentajeActividad() * nota.getId().getNotaActividad())/100;
					pfinal += promedio;
					System.out.println(nota.getId().getCodigoAlumno() +":"+ nota.getId().getNombreActividad() +">"+
					nota.getId().getNotaActividad()+"x" + nota.getId().getPorcentajeActividad() +"="+
					(nota.getId().getPorcentajeActividad() * nota.getId().getNotaActividad())/100+
					"|" + promedio);
				}
			}
			notaAlumno.setPromedio(pfinal);
			List<NotaAlumno> l = new ArrayList<NotaAlumno>();
			l.add(notaAlumno);			
			map.put("vwAlumnoNotasList", l);
			
			//System.out.println("nombre logado" + user.getUsername());
			return "/promedioAlumno";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
		
	}
	
	@RequestMapping("findNotasPeriodo")
	public String findNotasPeriodo(@ModelAttribute("na") @Valid NotaAlumno notaAlumno, BindingResult result, ModelMap map){
		try
		{
			List<NotaMateria> notasMateria = new ArrayList<NotaMateria>();
			//Saca expediente
			List listExpediente = expService.listAll(notaAlumno.getCodigoAlumno());
			TbExpediente expediente = (TbExpediente) listExpediente.get(0); //?Solo hay 1 expediente x alumno
			System.out.println(expediente.getIdExpediente());
			//Saca materias asociadas al expediente
			List listExpedienteMaterias = expService.listExpMatByExpediente(expediente.getIdExpediente());
			if(!listExpedienteMaterias.isEmpty()){
				Iterator it = listExpedienteMaterias.iterator();
				
				TbExpedienteHasMateria tempExpMat = null;
				
				
				
				while(it.hasNext()){
					NotaMateria notaMateria = new NotaMateria();
					boolean siHayNotas = false;
					double pfinal =0;
					tempExpMat = (TbExpedienteHasMateria) it.next();
					//Saca notas alumno x materia x periodo
					List notas = findServie.listVwNotasAlumnoPeriodoMateria(notaAlumno.getCodigoAlumno(),notaAlumno.getPeriodo(),tempExpMat.getTbSedeSeccionHasMateria().getTbMateria().getNombreMateria());
					
					if(!notas.isEmpty()){
						double promedio = 0;
						siHayNotas = true;
						Iterator itNota = notas.iterator();
						while(itNota.hasNext()){
							VwNotas nota = (VwNotas) itNota.next();
							promedio = (nota.getId().getPorcentajeActividad() * nota.getId().getNotaActividad())/100;
							pfinal += promedio;
						}
					}
					if(siHayNotas){
						System.out.println("entra al if");
						notaMateria.setCodigoAlumno(notaAlumno.getCodigoAlumno());
						notaMateria.setNombreComp(notaAlumno.getNombreComp());
						notaMateria.setNombreMateria(tempExpMat.getTbSedeSeccionHasMateria().getTbMateria().getNombreMateria());
						notaMateria.setPromedio(pfinal);
						notasMateria.add(notaMateria);
						notaMateria = null;
						}
				}
				
				}
						
			map.put("vwAlumnoNotasList", notasMateria);
			
			//System.out.println("nombre logado" + user.getUsername());
			return "/promedioAlumno";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
		
	}
	
	@RequestMapping("findNotasAlumnoProfesor")
	public String findNotasAlumnoProfesor(Map<String, Object> map){
		try
		{
			User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
			map.put("na", new NotaAlumno());
			map.put("vwAlumnoNotasList", findServie.listVwNotasProfe(user.getUsername()));
			
			//System.out.println("nombre logado" + user.getUsername());
			return "/notasAlumnoProfesor";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
		
	}
	
	@RequestMapping("findPromPeriodoProfesor")
	public String findPromPeriodoProfesor(Map<String, Object> map){
		try
		{
			User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
			
			map.put("vwNotasPeriodoProfesor", findServie.listVwPromedioPeriodoProf(user.getUsername()));
			
			//System.out.println("nombre logado" + user.getUsername());
			return "/promedioProfesorPeriodo";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
		
	}
	
	@RequestMapping("findPromPeriodoAlumno")
	public String findPromPeriodoAlumno(Map<String, Object> map){
		try
		{
			User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
			
			map.put("vwNotasPeriodoAlumno", findServie.listVwPromedioPeriodoAlum(user.getUsername()));
			
			//System.out.println("nombre logado" + user.getUsername());
			return "/promedioAlumnoPeriodo";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
		
	}
	
	/**
	 * Seccion de Alumnos x Encargado
	 */
	
	@RequestMapping("findAlumEncargado")
	public String findAlumEncargado(Map<String, Object> map,HttpServletRequest request){
		try
		{
			User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
			map.put("hijo", new NotaAlumno());
			map.put("alumnoEList", findServie.listVwAlumnoEncargado(user.getUsername()));
			return "findAlumnoEncargado";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
	}
	
	@RequestMapping("findPromPeriodoEnc")
	public String findPromPeriodoEnc(@ModelAttribute("hijo") @Valid NotaAlumno hijo, Map<String, Object> map){
		try
		{
			map.put("vwNotasPeriodoAlumno", findServie.listVwPromedioPeriodoAlum(hijo.getCodigoAlumno()));
			
			return "/promedioAlumnoPeriodo";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
		
	}
	
	@RequestMapping("findProfesorMateria")
	public String findProfesorMateria(Map<String, Object> map,HttpServletRequest request){
		try
		{
			
			
			map.put("profMateriaList", findServie.listVwRotaciones());
			return "findProfesorMateria";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
	}
	
	
	@RequestMapping("findAlumnoGrado")
	public String findAlumnoGrado(Map<String, Object> map,HttpServletRequest request){
		try
		{
			
			
			map.put("alumnoGradoList", findServie.listVwInscripciones());
			return "findAlumnoGrado";
		}catch(Exception ex){
			ex.printStackTrace();
			return "/login";	
			}
	}
	
}
